package com.example.gcmtest;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.gcmtest.MarathonDataBase.MarathonDataBase;
import com.google.android.gcm.GCMRegistrar;

public class MainActivity extends Activity implements OnClickListener{
	//====================================================================
	// UI関係変数宣言
	//====================================================================
	private Button onButton;					// GCM登録ボタン用
	private Button offButton;					// GCM解除ボタン用
	private Button sendButton;					// メッセージ送信ボタン用
	private Button MailButton;					// 登録IDメール送信ボタン用
	private Button RegSendButton;				// 登録申請ボタン用
	private Button NameButton;					// 名前登録ボタン用
	private Button ChangeButton;				// 送信相手変更ボタン用
	private Button GetGPSButton;				// GPS取得要求ボタン用

	private AlertDialog listDialog; // 送信相手選択用リストダイアログ
	private EditText Nameedit; // 名前入力用
	private EditText regedit; // 登録ID入力用
	private EditText editText; // メッセージ内容入力用
	private MarathonDataBase marathonDB; // データベースクラス

	//====================================================================
	// メンバ変数宣言
	//====================================================================
	private String regId;						// GCM登録後自分のID保管用
	private String sendId="";					// 送信相手のID保管用
	private Context context = this;				// コンテキスト引き渡し用
	private String[] SendIds;					// 複数人送信用

	//====================================================================
	// メイン処理（UI関係インスタンス取得、メールからの起動時処理）
	//====================================================================
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//=====================================================
		// UI関係設定
		//=====================================================

		// データベースクラス生成
		marathonDB = MarathonDataBase.getInstance();
		marathonDB.setContext(this);
//		marathonDB = new MarathonDataBase(this);

		// GCM登録ボタン
		onButton  = (Button)findViewById(R.id.btn_Sign_up);
		onButton.setOnClickListener(this);

		// GCM解除ボタン
		offButton  = (Button)findViewById(R.id.btn_Release);
		offButton.setOnClickListener(this);

		// 登録IDメール送信ボタン
		MailButton  = (Button)findViewById(R.id.send_mail);
		MailButton.setOnClickListener(this);

		// 登録申請ボタン
		RegSendButton  = (Button)findViewById(R.id.Reg_Send);
		RegSendButton.setOnClickListener(this);

		// 名前登録ボタン
		NameButton  = (Button)findViewById(R.id.Name_btn);
		NameButton.setOnClickListener(this);

		// 送信相手選択ボタン
		ChangeButton  = (Button)findViewById(R.id.SendChange);
		ChangeButton.setOnClickListener(this);

		// 登録申請ID入力
		regedit = (EditText) findViewById(R.id.IDedit);

		// 名前入力
		Nameedit = (EditText) findViewById(R.id.NameEdit);

		// メッセージ送信ボタン
		sendButton  = (Button)findViewById(R.id.btn_msg_send);
		sendButton.setOnClickListener(this);

		// メッセージ送信ボタン
		GetGPSButton = (Button)findViewById(R.id.GetGPS);
		GetGPSButton.setOnClickListener(this);

		// メッセージ入力
		editText = (EditText) findViewById(R.id.edittext);

		//=======================================================
		// デバイスとマニュフェストがGCM使用可能状態かを判定する
		//=======================================================
		try{
			// デバイスチェック
			GCMRegistrar.checkDevice(this);
			// マニュフェストチェック
			GCMRegistrar.checkManifest(this);
		}
		catch(Exception e ){
			Log.d(CommonUtilities.TAG_GCM, "Exception :" + e);
		}

		//==============================================
		// メールから起動された場合
		//==============================================
		Intent intent = getIntent();
	    String action = intent.getAction();
	    if (Intent.ACTION_VIEW.equals(action)) {
	    	Uri uri = intent.getData();
	    	if (uri!=null) {
	    		String url="";
	    		url = uri.toString();
	    		String[] array_url = url.split("/");
	    		Log.i(CommonUtilities.TAG_GCM, array_url[3]);

	    		regedit.setText(array_url[3]);
	        }
	    }


	}

	@Override
	public void onClick(View v) {
		// 登録が完了していれば、GCMRegistrar.getRegistrationIdで登録IDが取得できる。登録IDが取得できるかどうかで判定処理を行う
		regId = GCMRegistrar.getRegistrationId(getBaseContext());

		// 登録IDが取得できていない時の処理（なし）
		if(regId.equals("")){
			// no content
		}

		// 登録IDを取得出来ている時の処理（プリファレンスに自身のIDを保存）
		else{
			// プリファレンス名：pref  モード：自身のアプリのみ使用可能設定
			marathonDB.setText("ID",regId); // 自身のIDを保存
		}

		// 自身のIDを画面に表示しています。（テストアプリ内の処理なので後に消す）
		((TextView) findViewById(R.id.regID)).setText(regId);

		// GCM登録処理
		if (v == onButton){
			if (regId.equals("")) {
				//GCM登録処理を行う。パラメータにセンダーIDを渡す。結果処理はインテントサービスGCMIntentService のonRegisteredメソッドで行う
				GCMRegistrar.register(getBaseContext(), CommonUtilities.SENDER_ID);
			}else{
				Log.d(CommonUtilities.TAG_GCM, "Already registered.");
			}
		}

		// GCM解除処理
		else if (v == offButton){
			if (regId.equals("")) {
				Log.d(CommonUtilities.TAG_GCM, "Already unregistered.");
			}else{
				// GCM解除処理を行う。結果処理はインテントサービスGCMIntentService のonUnregisteredメソッドで行う。
				GCMRegistrar.unregister(getBaseContext());
			}
		}

		// 登録申請メール作成処理
		else if (v == MailButton){
			// GCM登録が行われておらず、自身のIDが取得できていない時の処理
			if(regId.equals("")){
				// 画面中央部にGCM登録を促すメッセージを表示
				Toast toast =Toast.makeText(context, "GCM登録を行ってください",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}

			// メーラーを起動してメールタイトルと本文に自身のIDを付与したリンク文を記載
			else{

				// メーラー起動用インテント取得
				Intent mailIntent = new Intent(Intent.ACTION_SENDTO);
				// メールタイトル文設定
				mailIntent.putExtra(Intent.EXTRA_SUBJECT, "登録依頼 GCMID送付");
				// メール本文（リンクをタップしてアプリが起動する様にするため、http始まりの文とする）
				mailIntent.putExtra(Intent.EXTRA_TEXT,"http://com.example.gcmtest"+"/"+ regId );

				// 送信相手を設定（ユーザ本人に記述してもらうため空白）
				mailIntent.setData(Uri.parse("mailto:"));

				// メーラー起動
				startActivity(Intent.createChooser(mailIntent,"select"));
			}
		}

		// メッセージ送信処理
		else if (v == sendButton){
			boolean no_inp = false;
			String mes="";

			// 入力欄に文字列が入力されていないとき
			if(editText.getText().toString().equals("")){
				no_inp = true;
			}

			// 文字列の入力を促すメッセージを表示
			if(no_inp==true){
				Toast toast = Toast.makeText(context, "送信文を入力して下さい。",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}

			// 文字列が入力されていた場合
			if(no_inp==false){
				// 入力欄に入力されている文字列を取得
				mes = editText.getText().toString();
				try {
					String enqmes = new String(mes.getBytes("UTF-8"), "UTF-8");
					String[] ids = {sendId};
					SendAsyncTask task = new SendAsyncTask(ids ,"1," + enqmes + ",");
					task.execute();
				} catch (UnsupportedEncodingException e) {
					// TODO 自動生成された catch ブロック
					e.printStackTrace();
				}
			}

			//==================================================================
			// ログ確認用（GCM受信時のメッセージを全表示）
			//==================================================================
			String text = marathonDB.getText("MES_LOG",""); // メッセージログ取得
			Log.i(CommonUtilities.TAG_GCM, text);
			//==================================================================
			// サービスストップ
			stopService(new Intent(context, GPSManagerService.class));
		}

		// 登録申請（GCM）
		else if (v == RegSendButton){
			boolean no_inp = false;
			boolean no_name = false;
			String Name  = marathonDB.getText("NAME", ""); //自身の名前を取得
			String id="";
			// 入力欄に文字列が入力されていないとき
			if(regedit.getText().toString().equals("")){
				no_inp = true;
			}
			if(Name.equals("")){
				no_name = true;
			}
			// 文字列の入力を促すメッセージを表示
			if(no_inp==true){
				Toast toast =Toast.makeText(context, "申請IDを入力して下さい。",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}
			if(no_name==true){
				Toast toast =Toast.makeText(context, "名前を登録して下さい。",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}
			// 文字列が入力されていた場合
			if(no_inp==false && no_name==false){
				// 入力欄に入力されている文字列を取得
				id = regedit.getText().toString();
				String[] ids = {id};
				SendAsyncTask task = new SendAsyncTask(ids,"2,"+ regId + "," + Name + ",");
				task.execute();
			}
		}

		// 名前登録
		else if (v == NameButton){
			boolean no_inp = false;
			String Name = "";
			// 入力欄に文字列が入力されていないとき
			if(Nameedit.getText().toString().equals("")){
				no_inp = true;
			}
			// 文字列の入力を促すメッセージを表示
			if(no_inp==true){
				Toast toast =Toast.makeText(context, "名前を入力して下さい。",Toast.LENGTH_LONG);
				toast.setGravity(Gravity.CENTER, 0, 0);
				toast.show();
			}
			// 文字列が入力されていた場合
			if(no_inp==false){
				// 入力欄に入力されている文字列を取得
				Name = Nameedit.getText().toString();
				marathonDB.setText("NAME",Name); // 自身の名前を保存
				Log.i(CommonUtilities.TAG_GCM, Name);
			}
		}

		// 送信相手選択
		else if (v == ChangeButton){
			final ArrayList<String> rows = new ArrayList<String>();
			ListView lv = new ListView(context);
			int reg_cnt = marathonDB.getInteger("regno", 0); // フレンド数を取得

			for(int i = 1;i<=reg_cnt ;i++){
				String Name = marathonDB.getText("NAME"+i,"NoName"); // フレンド名を取得
				rows.add(Name);
			}
			lv.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, rows));
			lv.setScrollingCacheEnabled(false);
			lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
				public void onItemClick(AdapterView<?> items, View view, int position, long id) {
					int pos=position+1;
					listDialog.dismiss();
					sendId = marathonDB.getText("ID" + pos,""); // フレンドのIDを取得
				}
			});
			AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
			alertDialogBuilder.setTitle("送信相手選択");
			alertDialogBuilder.setMessage("送信する相手を選択して下さい");
			alertDialogBuilder.setView(lv);
			alertDialogBuilder.setCancelable(true);
			listDialog = alertDialogBuilder.create();
			listDialog.show();

			// サービススタート
			startService(new Intent(context, GPSManagerService.class));
		}

		// GPS取得要求
		else if (v == GetGPSButton){
			int reg_cnt = marathonDB.getInteger("regno", 0);
			// 初期化処理
			marathonDB.removeText("GPS_FLG");
			marathonDB.removeText("CHANGE_NO");
			for(int i=1;i<=reg_cnt;i++){
				marathonDB.removeText("RUN_LATI"+i);
				marathonDB.removeText("RUN_LONGI"+i);
			}



			String[] IDS = new String[reg_cnt];
			for(int i=1;i<=reg_cnt;i++){
				IDS[i-1] = marathonDB.getText("ID"+i, "");
			}

			SendAsyncTask task = new SendAsyncTask(IDS,"4,"+ regId + ",");
			task.execute();

			SendIds = IDS;

			new Thread(new Runnable() {
		        @Override
		        public void run() {
		        	boolean end_flg = false;
		        	while(end_flg==false){
		        		try {
		        			// 無限ループを0.5ミリ秒止める(これがないと延々この処理だけが動いてしまい、送信処理をうけつけなくなる、むしろ落ちる)
							Thread.sleep(CommonUtilities.NEXT_SEND_TIME);
						} catch(InterruptedException e) {
							e.printStackTrace();
						}
		        		Log.i(CommonUtilities.TAG_GCM,"ID:"+SendIds[0]);
		    			SendAsyncTask task = new SendAsyncTask(SendIds,"4,"+ regId + ",");
						task.execute();

					}
		        }
	        }).start();
			Intent i = new Intent(context,MapActivity.class);
			startActivity(i);
		}
	}





	public class SendAsyncTask extends AsyncTask<String, String, Long> {
		private String mRegId;
		private String mMsg;
		private String[] mRegIds;


	    public SendAsyncTask(String[] regIds,String msg){
	    	this.mRegIds = regIds;
	    	this.mMsg = msg;
	    }



	    /**
	     * バックグランドで行う処理
	     */
	    @Override
	    protected Long doInBackground(String... params) {
	    	// プレーンテキストで送る場合
	    	//ServerUtilities.sendMessage(mRegId,mMsg);
	        // JSONで送る場合
	    	GCMServer.SendMsg(mRegIds,mMsg);

	    	return null;
	    }
	}

}
